/* eslint-disable */
/**
 * Copyright (C) 2010-2015 Graham Breach
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * TagCanvas 2.9
 * For more information, please contact <graham@goat1000.com>
 */
(function() {
    var M, K, L = Math.abs, ah = Math.sin, w = Math.cos, s = Math.max, aD = Math.min, ap = Math.ceil, F = Math.sqrt,
      at = Math.pow, h = {}, l = {}, m = {
        0: '0,',
        1: '17,',
        2: '34,',
        3: '51,',
        4: '68,',
        5: '85,',
        6: '102,',
        7: '119,',
        8: '136,',
        9: '153,',
        a: '170,',
        A: '170,',
        b: '187,',
        B: '187,',
        c: '204,',
        C: '204,',
        d: '221,',
        D: '221,',
        e: '238,',
        E: '238,',
        f: '255,',
        F: '255,'
      }, x, c, Q, aF, H, aG, aa, C = document, p, b = {};
    for (M = 0; M < 256; ++M) {
      K = M.toString(16);
      if (M < 16) {
        K = '0' + K;
      }
      l[K] = l[K.toUpperCase()] = M.toString() + ',';
    }

    function ai(i) {
      return typeof i != 'undefined';
    }

    function I(i) {
      return typeof i == 'object' && i != null;
    }

    function av(i, j, aH) {
      return isNaN(i) ? aH : aD(aH, s(j, i));
    }

    function aA() {
      return false;
    }

    function G() {
      return new Date().valueOf();
    }

    function A(aH, aK) {
      var j = [], aI = aH.length, aJ;
      for (aJ = 0; aJ < aI; ++aJ) {
        j.push(aH[aJ]);
      }
      j.sort(aK);
      return j;
    }

    function an(j) {
      var aI = j.length - 1, aH, aJ;
      while (aI) {
        aJ = ~~(Math.random() * aI);
        aH = j[aI];
        j[aI] = j[aJ];
        j[aJ] = aH;
        --aI;
      }
    }

    function ae(i, aH, j) {
      this.x = i;
      this.y = aH;
      this.z = j;
    }

    H = ae.prototype;
    H.length = function() {
      return F(this.x * this.x + this.y * this.y + this.z * this.z);
    }
    ;
    H.dot = function(i) {
      return this.x * i.x + this.y * i.y + this.z * i.z;
    }
    ;
    H.cross = function(j) {
      var i = this.y * j.z - this.z * j.y
        , aI = this.z * j.x - this.x * j.z
        , aH = this.x * j.y - this.y * j.x;
      return new ae(i, aI, aH);
    }
    ;
    H.angle = function(j) {
      var i = this.dot(j), aH;
      if (i == 0) {
        return Math.PI / 2;
      }
      aH = i / (this.length() * j.length());
      if (aH >= 1) {
        return 0;
      }
      if (aH <= -1) {
        return Math.PI;
      }
      return Math.acos(aH);
    }
    ;
    H.unit = function() {
      var i = this.length();
      return new ae(this.x / i, this.y / i, this.z / i);
    }
    ;

    function aj(aH, j) {
      j = j * Math.PI / 180;
      aH = aH * Math.PI / 180;
      var i = ah(aH) * w(j)
        , aJ = -ah(j)
        , aI = -w(aH) * w(j);
      return new ae(i, aJ, aI);
    }

    function R(i) {
      this[1] = {
        1: i[0],
        2: i[1],
        3: i[2]
      };
      this[2] = {
        1: i[3],
        2: i[4],
        3: i[5]
      };
      this[3] = {
        1: i[6],
        2: i[7],
        3: i[8]
      };
    }

    aF = R.prototype;
    R.Identity = function() {
      return new R([1, 0, 0, 0, 1, 0, 0, 0, 1]);
    }
    ;
    R.Rotation = function(aI, i) {
      var j = ah(aI)
        , aH = w(aI)
        , aJ = 1 - aH;
      return new R([aH + at(i.x, 2) * aJ, i.x * i.y * aJ - i.z * j, i.x * i.z * aJ + i.y * j, i.y * i.x * aJ + i.z * j, aH + at(i.y, 2) * aJ, i.y * i.z * aJ - i.x * j, i.z * i.x * aJ - i.y * j, i.z * i.y * aJ + i.x * j, aH + at(i.z, 2) * aJ]);
    }
    ;
    aF.mul = function(aH) {
      var aI = [], aL, aK, aJ = (aH.xform ? 1 : 0);
      for (aL = 1; aL <= 3; ++aL) {
        for (aK = 1; aK <= 3; ++aK) {
          if (aJ) {
            aI.push(this[aL][1] * aH[1][aK] + this[aL][2] * aH[2][aK] + this[aL][3] * aH[3][aK]);
          } else {
            aI.push(this[aL][aK] * aH);
          }
        }
      }
      return new R(aI);
    }
    ;
    aF.xform = function(aH) {
      var j = {}
        , i = aH.x
        , aJ = aH.y
        , aI = aH.z;
      j.x = i * this[1][1] + aJ * this[2][1] + aI * this[3][1];
      j.y = i * this[1][2] + aJ * this[2][2] + aI * this[3][2];
      j.z = i * this[1][3] + aJ * this[2][3] + aI * this[3][3];
      return j;
    }
    ;

    function q(aI, aK, aQ, aN, aP) {
      var aL, aO, j, aM, aR = [], aH = 2 / aI, aJ;
      aJ = Math.PI * (3 - F(5) + (parseFloat(aP) ? parseFloat(aP) : 0));
      for (aL = 0; aL < aI; ++aL) {
        aO = aL * aH - 1 + (aH / 2);
        j = F(1 - aO * aO);
        aM = aL * aJ;
        aR.push([w(aM) * j * aK, aO * aQ, ah(aM) * j * aN]);
      }
      return aR;
    }

    function W(aJ, aH, aM, aT, aQ, aS) {
      var aR, aU = [], aI = 2 / aJ, aK, aP, aO, aN, aL;
      aK = Math.PI * (3 - F(5) + (parseFloat(aS) ? parseFloat(aS) : 0));
      for (aP = 0; aP < aJ; ++aP) {
        aO = aP * aI - 1 + (aI / 2);
        aR = aP * aK;
        aN = w(aR);
        aL = ah(aR);
        aU.push(aH ? [aO * aM, aN * aT, aL * aQ] : [aN * aM, aO * aT, aL * aQ]);
      }
      return aU;
    }

    function N(aH, aI, aL, aR, aP, aN) {
      var aQ, aS = [], aJ = Math.PI * 2 / aI, aO, aM, aK;
      for (aO = 0; aO < aI; ++aO) {
        aQ = aO * aJ;
        aM = w(aQ);
        aK = ah(aQ);
        aS.push(aH ? [aN * aL, aM * aR, aK * aP] : [aM * aL, aN * aR, aK * aP]);
      }
      return aS;
    }

    function am(aJ, j, aH, aI, i) {
      return W(aJ, 0, j, aH, aI, i);
    }

    function au(aJ, j, aH, aI, i) {
      return W(aJ, 1, j, aH, aI, i);
    }

    function d(aJ, i, j, aH, aI) {
      aI = isNaN(aI) ? 0 : aI * 1;
      return N(0, aJ, i, j, aH, aI);
    }

    function n(aJ, i, j, aH, aI) {
      aI = isNaN(aI) ? 0 : aI * 1;
      return N(1, aJ, i, j, aH, aI);
    }

    function ao(aH) {
      var j = new Image;
      j.onload = function() {
        var aI = j.width / 2
          , i = j.height / 2;
        aH.centreFunc = function(aN, aK, aL, aJ, aM) {
          aN.setTransform(1, 0, 0, 1, 0, 0);
          aN.globalAlpha = 1;
          aN.drawImage(j, aJ - aI, aM - i);
        };
      }
      ;
      j.src = aH.centreImage;
    }

    function U(aK, i) {
      var aJ = aK, aI, aH, j = (i * 1).toPrecision(3) + ')';
      if (aK[0] === '#') {
        if (!h[aK]) {
          if (aK.length === 4) {
            h[aK] = 'rgba(' + m[aK[1]] + m[aK[2]] + m[aK[3]];
          } else {
            h[aK] = 'rgba(' + l[aK.substr(1, 2)] + l[aK.substr(3, 2)] + l[aK.substr(5, 2)];
          }
        }
        aJ = h[aK] + j;
      } else {
        if (aK.substr(0, 4) === 'rgb(' || aK.substr(0, 4) === 'hsl(') {
          aJ = (aK.replace('(', 'a(').replace(')', ',' + j));
        } else {
          if (aK.substr(0, 5) === 'rgba(' || aK.substr(0, 5) === 'hsla(') {
            aI = aK.lastIndexOf(',') + 1,
              aH = aK.indexOf(')');
            i *= parseFloat(aK.substring(aI, aH));
            aJ = aK.substr(0, aI) + i.toPrecision(3) + ')';
          }
        }
      }
      return aJ;
    }

    function P(i, j) {
      if (window.G_vmlCanvasManager) {
        return null;
      }
      var aH = C.createElement('canvas');
      aH.width = i;
      aH.height = j;
      return aH;
    }

    function al() {
      var j = P(3, 3), aI, aH;
      if (!j) {
        return false;
      }
      aI = j.getContext('2d');
      aI.strokeStyle = '#000';
      aI.shadowColor = '#fff';
      aI.shadowBlur = 3;
      aI.globalAlpha = 0;
      aI.strokeRect(2, 2, 2, 2);
      aI.globalAlpha = 1;
      aH = aI.getImageData(2, 2, 1, 1);
      j = null;
      return (aH.data[0] > 0);
    }

    function ak(aL, j, aK, aJ) {
      var aI = aL.createLinearGradient(0, 0, j, 0), aH;
      for (aH in aJ) {
        aI.addColorStop(1 - aH, aJ[aH]);
      }
      aL.fillStyle = aI;
      aL.fillRect(0, aK, j, 1);
    }

    function k(aJ, aH, j) {
      var aI = 1024, aN = 1, aM = aJ.weightGradient, aL, aP, aK, aO;
      if (aJ.gCanvas) {
        aP = aJ.gCanvas.getContext('2d');
        aN = aJ.gCanvas.height;
      } else {
        if (I(aM[0])) {
          aN = aM.length;
        } else {
          aM = [aM];
        }
        aJ.gCanvas = aL = P(aI, aN);
        if (!aL) {
          return null;
        }
        aP = aL.getContext('2d');
        for (aK = 0; aK < aN; ++aK) {
          ak(aP, aI, aK, aM[aK]);
        }
      }
      j = s(aD(j || 0, aN - 1), 0);
      aO = aP.getImageData(~~((aI - 1) * aH), j, 1, 1).data;
      return 'rgba(' + aO[0] + ',' + aO[1] + ',' + aO[2] + ',' + (aO[3] / 255) + ')';
    }

    function X(aQ, aJ, j, aU, aT, aR, aP, aL, aI, aS, aK, aO) {
      var aN = aT + (aL || 0) + (aI.length && aI[0] < 0 ? L(aI[0]) : 0),
        aH = aR + (aL || 0) + (aI.length && aI[1] < 0 ? L(aI[1]) : 0), aM, aV;
      aQ.font = aJ;
      aQ.textBaseline = 'top';
      aQ.fillStyle = j;
      aP && (aQ.shadowColor = aP);
      aL && (aQ.shadowBlur = aL);
      aI.length && (aQ.shadowOffsetX = aI[0],
        aQ.shadowOffsetY = aI[1]);
      for (aM = 0; aM < aU.length; ++aM) {
        aV = 0;
        if (aK) {
          if ('right' == aO) {
            aV = aS - aK[aM];
          } else {
            if ('centre' == aO) {
              aV = (aS - aK[aM]) / 2;
            }
          }
        }
        aQ.fillText(aU[aM], aN + aV, aH);
        aH += parseInt(aJ);
      }
    }

    function ar(aL, i, aK, j, aI, aJ, aH) {
      if (aJ) {
        aL.beginPath();
        aL.moveTo(i, aK + aI - aJ);
        aL.arcTo(i, aK, i + aJ, aK, aJ);
        aL.arcTo(i + j, aK, i + j, aK + aJ, aJ);
        aL.arcTo(i + j, aK + aI, i + j - aJ, aK + aI, aJ);
        aL.arcTo(i, aK + aI, i, aK + aI - aJ, aJ);
        aL.closePath();
        aL[aH ? 'stroke' : 'fill']();
      } else {
        aL[aH ? 'strokeRect' : 'fillRect'](i, aK, j, aI);
      }
    }

    function g(aN, i, aL, aI, aM, aH, aJ, aK, j) {
      this.strings = aN;
      this.font = i;
      this.width = aL;
      this.height = aI;
      this.maxWidth = aM;
      this.stringWidths = aH;
      this.align = aJ;
      this.valign = aK;
      this.scale = j;
    }

    aa = g.prototype;
    aa.SetImage = function(aK, j, aI, i, aJ, aM, aH, aL) {
      this.image = aK;
      this.iwidth = j * this.scale;
      this.iheight = aI * this.scale;
      this.ipos = i;
      this.ipad = aJ * this.scale;
      this.iscale = aL;
      this.ialign = aM;
      this.ivalign = aH;
    }
    ;
    aa.Align = function(j, aH, i) {
      var aI = 0;
      if (i == 'right' || i == 'bottom') {
        aI = aH - j;
      } else {
        if (i != 'left' && i != 'top') {
          aI = (aH - j) / 2;
        }
      }
      return aI;
    }
    ;
    aa.Create = function(aU, a0, aT, a1, aZ, aY, i, aX, aP) {
      var aN, aL, aV, a6, a3, a2, aJ, aI, aH, j, aM, aK, aO, aW, aS, a5 = L(i[0]), a4 = L(i[1]), aQ, aR;
      aX = s(aX, a5 + aY, a4 + aY);
      a3 = 2 * (aX + a1);
      aJ = 2 * (aX + a1);
      aL = this.width + a3;
      aV = this.height + aJ;
      aH = j = aX + a1;
      if (this.image) {
        aM = aK = aX + a1;
        aO = this.iwidth;
        aW = this.iheight;
        if (this.ipos == 'top' || this.ipos == 'bottom') {
          if (aO < this.width) {
            aM += this.Align(aO, this.width, this.ialign);
          } else {
            aH += this.Align(this.width, aO, this.align);
          }
          if (this.ipos == 'top') {
            j += aW + this.ipad;
          } else {
            aK += this.height + this.ipad;
          }
          aL = s(aL, aO + a3);
          aV += aW + this.ipad;
        } else {
          if (aW < this.height) {
            aK += this.Align(aW, this.height, this.ivalign);
          } else {
            j += this.Align(this.height, aW, this.valign);
          }
          if (this.ipos == 'right') {
            aM += this.width + this.ipad;
          } else {
            aH += aO + this.ipad;
          }
          aL += aO + this.ipad;
          aV = s(aV, aW + aJ);
        }
      }
      aN = P(aL, aV);
      if (!aN) {
        return null;
      }
      a3 = aJ = a1 / 2;
      a2 = aL - a1;
      aI = aV - a1;
      aS = aD(aP, a2 / 2, aI / 2);
      a6 = aN.getContext('2d');
      if (a0) {
        a6.fillStyle = a0;
        ar(a6, a3, aJ, a2, aI, aS);
      }
      if (a1) {
        a6.strokeStyle = aT;
        a6.lineWidth = a1;
        ar(a6, a3, aJ, a2, aI, aS, true);
      }
      if (aY || a5 || a4) {
        aQ = P(aL, aV);
        if (aQ) {
          aR = a6;
          a6 = aQ.getContext('2d');
        }
      }
      X(a6, this.font, aU, this.strings, aH, j, 0, 0, [], this.maxWidth, this.stringWidths, this.align);
      if (this.image) {
        a6.drawImage(this.image, aM, aK, aO, aW);
      }
      if (aR) {
        a6 = aR;
        aZ && (a6.shadowColor = aZ);
        aY && (a6.shadowBlur = aY);
        a6.shadowOffsetX = i[0];
        a6.shadowOffsetY = i[1];
        a6.drawImage(aQ, 0, 0);
      }
      return aN;
    }
    ;

    function v(aI, j, aJ) {
      var aH = P(j, aJ), aK;
      if (!aH) {
        return null;
      }
      aK = aH.getContext('2d');
      aK.drawImage(aI, (j - aI.width) / 2, (aJ - aI.height) / 2);
      return aH;
    }

    function ax(aI, j, aJ) {
      var aH = P(j, aJ), aK;
      if (!aH) {
        return null;
      }
      aK = aH.getContext('2d');
      aK.drawImage(aI, 0, 0, j, aJ);
      return aH;
    }

    function aC(aU, aP, aV, aZ, aQ, aO, aM, aS, aK, aL) {
      var aI = aP + ((2 * aS) + aO) * aZ, aR = aV + ((2 * aS) + aO) * aZ, aJ = P(aI, aR), aY, aX, aH, aW, j, a0, aT, aN;
      if (!aJ) {
        return null;
      }
      aO *= aZ;
      aK *= aZ;
      aX = aH = aO / 2;
      aW = aI - aO;
      j = aR - aO;
      aS = (aS * aZ) + aX;
      aY = aJ.getContext('2d');
      aN = aD(aK, aW / 2, j / 2);
      if (aQ) {
        aY.fillStyle = aQ;
        ar(aY, aX, aH, aW, j, aN);
      }
      if (aO) {
        aY.strokeStyle = aM;
        aY.lineWidth = aO;
        ar(aY, aX, aH, aW, j, aN, true);
      }
      if (aL) {
        a0 = P(aI, aR);
        aT = a0.getContext('2d');
        aT.drawImage(aU, aS, aS, aP, aV);
        aT.globalCompositeOperation = 'source-in';
        aT.fillStyle = aM;
        aT.fillRect(0, 0, aI, aR);
        aT.globalCompositeOperation = 'destination-over';
        aT.drawImage(aJ, 0, 0);
        aT.globalCompositeOperation = 'source-over';
        aY.drawImage(a0, 0, 0);
      } else {
        aY.drawImage(aU, aS, aS, aU.width, aU.height);
      }
      return {
        image: aJ,
        width: aI / aZ,
        height: aR / aZ
      };
    }

    function aq(aK, j, aJ, aN, aO) {
      var aL, aM, aH = parseFloat(j), aI = s(aJ, aN);
      aL = P(aJ, aN);
      if (!aL) {
        return null;
      }
      if (j.indexOf('%') > 0) {
        aH = aI * aH / 100;
      } else {
        aH = aH * aO;
      }
      aM = aL.getContext('2d');
      aM.globalCompositeOperation = 'source-over';
      aM.fillStyle = '#fff';
      if (aH >= aI / 2) {
        aH = aD(aJ, aN) / 2;
        aM.beginPath();
        aM.moveTo(aJ / 2, aN / 2);
        aM.arc(aJ / 2, aN / 2, aH, 0, 2 * Math.PI, false);
        aM.fill();
        aM.closePath();
      } else {
        aH = aD(aJ / 2, aN / 2, aH);
        ar(aM, 0, 0, aJ, aN, aH, true);
        aM.fill();
      }
      aM.globalCompositeOperation = 'source-in';
      aM.drawImage(aK, 0, 0, aJ, aN);
      return aL;
    }

    function Z(aN, aT, aP, aJ, aR, aS, aI) {
      var aU = L(aI[0]), aO = L(aI[1]), aK = aT + (aU > aS ? aU + aS : aS * 2) * aJ,
        j = aP + (aO > aS ? aO + aS : aS * 2) * aJ, aM = aJ * ((aS || 0) + (aI[0] < 0 ? aU : 0)),
        aH = aJ * ((aS || 0) + (aI[1] < 0 ? aO : 0)), aL, aQ;
      aL = P(aK, j);
      if (!aL) {
        return null;
      }
      aQ = aL.getContext('2d');
      aR && (aQ.shadowColor = aR);
      aS && (aQ.shadowBlur = aS * aJ);
      aI && (aQ.shadowOffsetX = aI[0] * aJ,
        aQ.shadowOffsetY = aI[1] * aJ);
      aQ.drawImage(aN, aM, aH, aT, aP);
      return {
        image: aL,
        width: aK / aJ,
        height: j / aJ
      };
    }

    function t(aT, aL, aR) {
      var aS = parseInt(aT.toString().length * aR), aK = parseInt(aR * 2 * aT.length), aI = P(aS, aK), aO, j, aJ, aN,
        aQ, aP, aH, aM;
      if (!aI) {
        return null;
      }
      aO = aI.getContext('2d');
      aO.fillStyle = '#000';
      aO.fillRect(0, 0, aS, aK);
      X(aO, aR + 'px ' + aL, '#fff', aT, 0, 0, 0, 0, [], 'centre');
      j = aO.getImageData(0, 0, aS, aK);
      aJ = j.width;
      aN = j.height;
      aM = {
        min: {
          x: aJ,
          y: aN
        },
        max: {
          x: -1,
          y: -1
        }
      };
      for (aP = 0; aP < aN; ++aP) {
        for (aQ = 0; aQ < aJ; ++aQ) {
          aH = (aP * aJ + aQ) * 4;
          if (j.data[aH + 1] > 0) {
            if (aQ < aM.min.x) {
              aM.min.x = aQ;
            }
            if (aQ > aM.max.x) {
              aM.max.x = aQ;
            }
            if (aP < aM.min.y) {
              aM.min.y = aP;
            }
            if (aP > aM.max.y) {
              aM.max.y = aP;
            }
          }
        }
      }
      if (aJ != aS) {
        aM.min.x *= (aS / aJ);
        aM.max.x *= (aS / aJ);
      }
      if (aN != aK) {
        aM.min.y *= (aS / aN);
        aM.max.y *= (aS / aN);
      }
      aI = null;
      return aM;
    }

    function o(i) {
      return '\'' + i.replace(/(\'|\")/g, '').replace(/\s*,\s*/g, '\', \'') + '\'';
    }

    function ad(i, j, aH) {
      aH = aH || C;
      if (aH.addEventListener) {
        aH.addEventListener(i, j, false);
      } else {
        aH.attachEvent('on' + i, j);
      }
    }

    function a(i, j, aH) {
      aH = aH || C;
      if (aH.removeEventListener) {
        aH.removeEventListener(i, j);
      } else {
        aH.detachEvent('on' + i, j);
      }
    }

    function aw(aL, aH, aP, aK) {
      var aQ = aK.imageScale, aN, aI, aM, j, aJ, aO;
      if (!aH.complete) {
        return ad('load', function() {
          aw(aL, aH, aP, aK);
        }, aH);
      }
      if (!aL.complete) {
        return ad('load', function() {
          aw(aL, aH, aP, aK);
        }, aL);
      }
      aH.width = aH.width;
      aH.height = aH.height;
      if (aQ) {
        aL.width = aH.width * aQ;
        aL.height = aH.height * aQ;
      }
      aP.iw = aL.width;
      aP.ih = aL.height;
      if (aK.txtOpt) {
        aI = aL;
        aN = aK.zoomMax * aK.txtScale;
        aJ = aP.iw * aN;
        aO = aP.ih * aN;
        if (aJ < aH.naturalWidth || aO < aH.naturalHeight) {
          aI = ax(aL, aJ, aO);
          if (aI) {
            aP.fimage = aI;
          }
        } else {
          aJ = aP.iw;
          aO = aP.ih;
          aN = 1;
        }
        if (parseFloat(aK.imageRadius)) {
          aP.image = aP.fimage = aL = aq(aP.image, aK.imageRadius, aJ, aO, aN);
        }
        if (!aP.HasText()) {
          if (aK.shadow) {
            aI = Z(aP.image, aJ, aO, aN, aK.shadow, aK.shadowBlur, aK.shadowOffset);
            if (aI) {
              aP.fimage = aI.image;
              aP.w = aI.width;
              aP.h = aI.height;
            }
          }
          if (aK.bgColour || aK.bgOutlineThickness) {
            aM = aK.bgColour == 'tag' ? Y(aP.a, 'background-color') : aK.bgColour;
            j = aK.bgOutline == 'tag' ? Y(aP.a, 'color') : (aK.bgOutline || aK.textColour);
            aJ = aP.fimage.width;
            aO = aP.fimage.height;
            if (aK.outlineMethod == 'colour') {
              aI = aC(aP.fimage, aJ, aO, aN, aM, aK.bgOutlineThickness, aP.outline.colour, aK.padding, aK.bgRadius, 1);
              if (aI) {
                aP.oimage = aI.image;
              }
            }
            aI = aC(aP.fimage, aJ, aO, aN, aM, aK.bgOutlineThickness, j, aK.padding, aK.bgRadius);
            if (aI) {
              aP.fimage = aI.image;
              aP.w = aI.width;
              aP.h = aI.height;
            }
          }
          if (aK.outlineMethod == 'size') {
            if (aK.outlineIncrease > 0) {
              aP.iw += 2 * aK.outlineIncrease;
              aP.ih += 2 * aK.outlineIncrease;
              aJ = aN * aP.iw;
              aO = aN * aP.ih;
              aI = ax(aP.fimage, aJ, aO);
              aP.oimage = aI;
              aP.fimage = v(aP.fimage, aP.oimage.width, aP.oimage.height);
            } else {
              aJ = aN * (aP.iw + (2 * aK.outlineIncrease));
              aO = aN * (aP.ih + (2 * aK.outlineIncrease));
              aI = ax(aP.fimage, aJ, aO);
              aP.oimage = v(aI, aP.fimage.width, aP.fimage.height);
            }
          }
        }
      }
      aP.Init();
    }

    function Y(aI, aH) {
      var j = C.defaultView
        , i = aH.replace(/\-([a-z])/g, function(aJ) {
        return aJ.charAt(1).toUpperCase();
      });
      return (j && j.getComputedStyle && j.getComputedStyle(aI, null).getPropertyValue(aH)) || (aI.currentStyle && aI.currentStyle[i]);
    }

    function u(j, aI, aH) {
      var i = 1, aJ;
      if (aI) {
        i = 1 * (j.getAttribute(aI) || aH);
      } else {
        if (aJ = Y(j, 'font-size')) {
          i = (aJ.indexOf('px') > -1 && aJ.replace('px', '') * 1) || (aJ.indexOf('pt') > -1 && aJ.replace('pt', '') * 1.25) || aJ * 3.3;
        }
      }
      return i;
    }

    function f(i) {
      return i.target && ai(i.target.id) ? i.target.id : i.srcElement.parentNode.id;
    }

    function S(aJ, aK) {
      var aI, aH, i = parseInt(Y(aK, 'width')) / aK.width, j = parseInt(Y(aK, 'height')) / aK.height;
      if (ai(aJ.offsetX)) {
        aI = {
          x: aJ.offsetX,
          y: aJ.offsetY
        };
      } else {
        aH = ab(aK.id);
        if (ai(aJ.changedTouches)) {
          aJ = aJ.changedTouches[0];
        }
        if (aJ.pageX) {
          aI = {
            x: aJ.pageX - aH.x,
            y: aJ.pageY - aH.y
          };
        }
      }
      if (aI && i && j) {
        aI.x /= i;
        aI.y /= j;
      }
      return aI;
    }

    function B(aH) {
      var j = aH.target || aH.fromElement.parentNode
        , i = y.tc[j.id];
      if (i) {
        i.mx = i.my = -1;
        i.UnFreeze();
        i.EndDrag();
      }
    }

    function af(aL) {
      var aI, aH = y, j, aK, aJ = f(aL);
      for (aI in aH.tc) {
        j = aH.tc[aI];
        if (j.tttimer) {
          clearTimeout(j.tttimer);
          j.tttimer = null;
        }
      }
      if (aJ && aH.tc[aJ]) {
        j = aH.tc[aJ];
        if (aK = S(aL, j.canvas)) {
          j.mx = aK.x;
          j.my = aK.y;
          j.Drag(aL, aK);
        }
        j.drawn = 0;
      }
    }

    function z(aI) {
      var j = y
        , i = C.addEventListener ? 0 : 1
        , aH = f(aI);
      if (aH && aI.button == i && j.tc[aH]) {
        j.tc[aH].BeginDrag(aI);
      }
    }

    function aE(aJ) {
      var aH = y, j = C.addEventListener ? 0 : 1, aI = f(aJ), i;
      if (aI && aJ.button == j && aH.tc[aI]) {
        i = aH.tc[aI];
        af(aJ);
        if (!i.EndDrag() && !i.touchState) {
          i.Clicked(aJ);
        }
      }
    }

    function T(aI) {
      var j = f(aI), i = (j && y.tc[j]), aH;
      if (i && aI.changedTouches) {
        if (aI.touches.length == 1 && i.touchState == 0) {
          i.touchState = 1;
          i.BeginDrag(aI);
          if (aH = S(aI, i.canvas)) {
            i.mx = aH.x;
            i.my = aH.y;
            i.drawn = 0;
          }
        } else {
          if (aI.targetTouches.length == 2 && i.pinchZoom) {
            i.touchState = 3;
            i.EndDrag();
            i.BeginPinch(aI);
          } else {
            i.EndDrag();
            i.EndPinch();
            i.touchState = 0;
          }
        }
      }
    }

    function r(aH) {
      var j = f(aH)
        , i = (j && y.tc[j]);
      if (i && aH.changedTouches) {
        switch (i.touchState) {
          case 1:
            i.Draw();
            i.Clicked();
            break;
          case 2:
            i.EndDrag();
            break;
          case 3:
            i.EndPinch();
        }
        i.touchState = 0;
      }
    }

    function az(aL) {
      var aI, aH = y, j, aK, aJ = f(aL);
      for (aI in aH.tc) {
        j = aH.tc[aI];
        if (j.tttimer) {
          clearTimeout(j.tttimer);
          j.tttimer = null;
        }
      }
      j = (aJ && aH.tc[aJ]);
      if (j && aL.changedTouches && j.touchState) {
        switch (j.touchState) {
          case 1:
          case 2:
            if (aK = S(aL, j.canvas)) {
              j.mx = aK.x;
              j.my = aK.y;
              if (j.Drag(aL, aK)) {
                j.touchState = 2;
              }
            }
            break;
          case 3:
            j.Pinch(aL);
        }
        j.drawn = 0;
      }
    }

    function ag(aH) {
      var i = y
        , j = f(aH);
      if (j && i.tc[j]) {
        aH.cancelBubble = true;
        aH.returnValue = false;
        aH.preventDefault && aH.preventDefault();
        i.tc[j].Wheel((aH.wheelDelta || aH.detail) > 0);
      }
    }

    function ac(aI) {
      var aH, j = y;
      clearTimeout(j.scrollTimer);
      for (aH in j.tc) {
        j.tc[aH].Pause();
      }
      j.scrollTimer = setTimeout(function() {
        var aK, aJ = y;
        for (aK in aJ.tc) {
          aJ.tc[aK].Resume();
        }
      }, j.scrollPause);
    }

    function O() {
      E(G());
    }

    function E(aI) {
      var j = y.tc, aH;
      y.NextFrame(y.interval);
      aI = aI || G();
      for (aH in j) {
        j[aH].Draw(aI);
      }
    }

    function ab(aH) {
      var aK = C.getElementById(aH)
        , i = aK.getBoundingClientRect()
        , aN = C.documentElement
        , aL = C.body
        , aM = window
        , aI = aM.pageXOffset || aN.scrollLeft
        , aO = aM.pageYOffset || aN.scrollTop
        , aJ = aN.clientLeft || aL.clientLeft
        , j = aN.clientTop || aL.clientTop;
      return {
        x: i.left + aI - aJ,
        y: i.top + aO - j
      };
    }

    function V(j, aI, aJ, aH) {
      var i = j.radius * j.z1 / (j.z1 + j.z2 + aI.z);
      return {
        x: aI.x * i * aJ,
        y: aI.y * i * aH,
        z: aI.z,
        w: (j.z1 - aI.z) / j.z2
      };
    }

    function aB(i) {
      this.e = i;
      this.br = 0;
      this.line = [];
      this.text = [];
      this.original = i.innerText || i.textContent;
    }

    aG = aB.prototype;
    aG.Empty = function() {
      for (var j = 0; j < this.text.length; ++j) {
        if (this.text[j].length) {
          return false;
        }
      }
      return true;
    }
    ;
    aG.Lines = function(aJ) {
      var aI = aJ ? 1 : 0, aK, j, aH;
      aJ = aJ || this.e;
      aK = aJ.childNodes;
      j = aK.length;
      for (aH = 0; aH < j; ++aH) {
        if (aK[aH].nodeName == 'BR') {
          this.text.push(this.line.join(' '));
          this.br = 1;
        } else {
          if (aK[aH].nodeType == 3) {
            if (this.br) {
              this.line = [aK[aH].nodeValue];
              this.br = 0;
            } else {
              this.line.push(aK[aH].nodeValue);
            }
          } else {
            this.Lines(aK[aH]);
          }
        }
      }
      aI || this.br || this.text.push(this.line.join(' '));
      return this.text;
    }
    ;
    aG.SplitWidth = function(aH, aO, aL, aK) {
      var aJ, aI, aN, aM = [];
      aO.font = aK + 'px ' + aL;
      for (aJ = 0; aJ < this.text.length; ++aJ) {
        aN = this.text[aJ].split(/\s+/);
        this.line = [aN[0]];
        for (aI = 1; aI < aN.length; ++aI) {
          if (aO.measureText(this.line.join(' ') + ' ' + aN[aI]).width > aH) {
            aM.push(this.line.join(' '));
            this.line = [aN[aI]];
          } else {
            this.line.push(aN[aI]);
          }
        }
        aM.push(this.line.join(' '));
      }
      return this.text = aM;
    }
    ;

    function J(i, j) {
      this.ts = null;
      this.tc = i;
      this.tag = j;
      this.x = this.y = this.w = this.h = this.sc = 1;
      this.z = 0;
      this.pulse = 1;
      this.pulsate = i.pulsateTo < 1;
      this.colour = i.outlineColour;
      this.adash = ~~i.outlineDash;
      this.agap = ~~i.outlineDashSpace || this.adash;
      this.aspeed = i.outlineDashSpeed * 1;
      if (this.colour == 'tag') {
        this.colour = Y(j.a, 'color');
      } else {
        if (this.colour == 'tagbg') {
          this.colour = Y(j.a, 'background-color');
        }
      }
      this.Draw = this.pulsate ? this.DrawPulsate : this.DrawSimple;
      this.radius = i.outlineRadius | 0;
      this.SetMethod(i.outlineMethod);
    }

    x = J.prototype;
    x.SetMethod = function(aH) {
      var j = {
        block: ['PreDraw', 'DrawBlock'],
        colour: ['PreDraw', 'DrawColour'],
        outline: ['PostDraw', 'DrawOutline'],
        classic: ['LastDraw', 'DrawOutline'],
        size: ['PreDraw', 'DrawSize'],
        none: ['LastDraw']
      }
        , i = j[aH] || j.outline;
      if (aH == 'none') {
        this.Draw = function() {
          return 1;
        };
      } else {
        this.drawFunc = this[i[1]];
      }
      this[i[0]] = this.Draw;
    }
    ;
    x.Update = function(aN, aM, aO, aJ, aK, aL, aI, i) {
      var j = this.tc.outlineOffset
        , aH = 2 * j;
      this.x = aK * aN + aI - j;
      this.y = aK * aM + i - j;
      this.w = aK * aO + aH;
      this.h = aK * aJ + aH;
      this.sc = aK;
      this.z = aL;
    }
    ;
    x.Ants = function(aM) {
      if (!this.adash) {
        return;
      }
      var aJ = this.adash, aL = this.agap, aP = this.aspeed, j = aJ + aL, aK = 0, aI = aJ, i = aL, aO = 0, aN = 0, aH;
      if (aP) {
        aN = L(aP) * (G() - this.ts) / 50;
        if (aP < 0) {
          aN = 8640000 - aN;
        }
        aP = ~~aN % j;
      }
      if (aP) {
        if (aJ >= aP) {
          aK = aJ - aP;
          aI = aP;
        } else {
          i = j - aP;
          aO = aL - i;
        }
        aH = [aK, i, aI, aO];
      } else {
        aH = [aJ, aL];
      }
      aM.setLineDash(aH);
    }
    ;
    x.DrawOutline = function(aL, i, aK, j, aH, aJ) {
      var aI = aD(this.radius, aH / 2, j / 2);
      aL.strokeStyle = aJ;
      this.Ants(aL);
      ar(aL, i, aK, j, aH, aI, true);
    }
    ;
    x.DrawSize = function(aO, aR, aP, aS, aM, j, aT, aI, aQ) {
      var aL = aT.w, aH = aT.h, aJ, aK, aN;
      if (this.pulsate) {
        if (aT.image) {
          aN = (aT.image.height + this.tc.outlineIncrease) / aT.image.height;
        } else {
          aN = aT.oscale;
        }
        aK = aT.fimage || aT.image;
        aJ = 1 + ((aN - 1) * (1 - this.pulse));
        aT.h *= aJ;
        aT.w *= aJ;
      } else {
        aK = aT.oimage;
      }
      aT.alpha = 1;
      aT.Draw(aO, aI, aQ, aK);
      aT.h = aH;
      aT.w = aL;
      return 1;
    }
    ;
    x.DrawColour = function(aI, aL, aJ, aM, aH, i, aN, j, aK) {
      if (aN.oimage) {
        if (this.pulse < 1) {
          aN.alpha = 1 - at(this.pulse, 2);
          aN.Draw(aI, j, aK, aN.fimage);
          aN.alpha = this.pulse;
        } else {
          aN.alpha = 1;
        }
        aN.Draw(aI, j, aK, aN.oimage);
        return 1;
      }
      return this[aN.image ? 'DrawColourImage' : 'DrawColourText'](aI, aL, aJ, aM, aH, i, aN, j, aK);
    }
    ;
    x.DrawColourText = function(aJ, aM, aK, aN, aH, i, aO, j, aL) {
      var aI = aO.colour;
      aO.colour = i;
      aO.alpha = 1;
      aO.Draw(aJ, j, aL);
      aO.colour = aI;
      return 1;
    }
    ;
    x.DrawColourImage = function(aM, aP, aN, aQ, aL, i, aT, j, aO) {
      var aR = aM.canvas, aJ = ~~s(aP, 0), aI = ~~s(aN, 0), aK = aD(aR.width - aJ, aQ) + 0.5 | 0,
        aS = aD(aR.height - aI, aL) + 0.5 | 0, aH;
      if (p) {
        p.width = aK,
          p.height = aS;
      } else {
        p = P(aK, aS);
      }
      if (!p) {
        return this.SetMethod('outline');
      }
      aH = p.getContext('2d');
      aH.drawImage(aR, aJ, aI, aK, aS, 0, 0, aK, aS);
      aM.clearRect(aJ, aI, aK, aS);
      if (this.pulsate) {
        aT.alpha = 1 - at(this.pulse, 2);
      } else {
        aT.alpha = 1;
      }
      aT.Draw(aM, j, aO);
      aM.setTransform(1, 0, 0, 1, 0, 0);
      aM.save();
      aM.beginPath();
      aM.rect(aJ, aI, aK, aS);
      aM.clip();
      aM.globalCompositeOperation = 'source-in';
      aM.fillStyle = i;
      aM.fillRect(aJ, aI, aK, aS);
      aM.restore();
      aM.globalAlpha = 1;
      aM.globalCompositeOperation = 'destination-over';
      aM.drawImage(p, 0, 0, aK, aS, aJ, aI, aK, aS);
      aM.globalCompositeOperation = 'source-over';
      return 1;
    }
    ;
    x.DrawBlock = function(aL, i, aK, j, aH, aJ) {
      var aI = aD(this.radius, aH / 2, j / 2);
      aL.fillStyle = aJ;
      ar(aL, i, aK, j, aH, aI);
    }
    ;
    x.DrawSimple = function(aL, i, j, aI, aK, aJ) {
      var aH = this.tc;
      aL.setTransform(1, 0, 0, 1, 0, 0);
      aL.strokeStyle = this.colour;
      aL.lineWidth = aH.outlineThickness;
      aL.shadowBlur = aL.shadowOffsetX = aL.shadowOffsetY = 0;
      aL.globalAlpha = aJ ? aK : 1;
      return this.drawFunc(aL, this.x, this.y, this.w, this.h, this.colour, i, j, aI);
    }
    ;
    x.DrawPulsate = function(aL, i, j, aI) {
      var aJ = G() - this.ts
        , aH = this.tc
        , aK = aH.pulsateTo + ((1 - aH.pulsateTo) * (0.5 + (w(2 * Math.PI * aJ / (1000 * aH.pulsateTime)) / 2)));
      this.pulse = aK = y.Smooth(1, aK);
      return this.DrawSimple(aL, i, j, aI, aK, 1);
    }
    ;
    x.Active = function(aI, i, aH) {
      var j = (i >= this.x && aH >= this.y && i <= this.x + this.w && aH <= this.y + this.h);
      if (j) {
        this.ts = this.ts || G();
      } else {
        this.ts = null;
      }
      return j;
    }
    ;
    x.PreDraw = x.PostDraw = x.LastDraw = aA;

    function e(aI, aS, aO, aR, aP, aJ, aH, aL, aQ, aK, aN, j, aM, i) {
      this.tc = aI;
      this.image = null;
      this.text = aS;
      this.text_original = i;
      this.line_widths = [];
      this.title = aO.title || null;
      this.a = aO;
      this.position = new ae(aR[0], aR[1], aR[2]);
      this.x = this.y = this.z = 0;
      this.w = aP;
      this.h = aJ;
      this.colour = aH || aI.textColour;
      this.bgColour = aL || aI.bgColour;
      this.bgRadius = aQ | 0;
      this.bgOutline = aK || this.colour;
      this.bgOutlineThickness = aN | 0;
      this.textFont = j || aI.textFont;
      this.padding = aM | 0;
      this.sc = this.alpha = 1;
      this.weighted = !aI.weight;
      this.outline = new J(aI, this);
    }

    c = e.prototype;
    c.Init = function(j) {
      var i = this.tc;
      this.textHeight = i.textHeight;
      if (this.HasText()) {
        this.Measure(i.ctxt, i);
      } else {
        this.w = this.iw;
        this.h = this.ih;
      }
      this.SetShadowColour = i.shadowAlpha ? this.SetShadowColourAlpha : this.SetShadowColourFixed;
      this.SetDraw(i);
    }
    ;
    c.Draw = aA;
    c.HasText = function() {
      return this.text && this.text[0].length > 0;
    }
    ;
    c.EqualTo = function(aH) {
      var j = aH.getElementsByTagName('img');
      if (this.a.href != aH.href) {
        return 0;
      }
      if (j.length) {
        return this.image.src == j[0].src;
      }
      return (aH.innerText || aH.textContent) == this.text_original;
    }
    ;
    c.SetImage = function(j) {
      this.image = this.fimage = j;
    }
    ;
    c.SetDraw = function(i) {
      this.Draw = this.fimage ? (i.ie > 7 ? this.DrawImageIE : this.DrawImage) : this.DrawText;
      i.noSelect && (this.CheckActive = aA);
    }
    ;
    c.MeasureText = function(aK) {
      var aI, aH = this.text.length, j = 0, aJ;
      for (aI = 0; aI < aH; ++aI) {
        this.line_widths[aI] = aJ = aK.measureText(this.text[aI]).width;
        j = s(j, aJ);
      }
      return j;
    }
    ;
    c.Measure = function(aM, aP) {
      var aN = t(this.text, this.textFont, this.textHeight), aQ, i, aJ, j, aH, aL, aO, aI, aK;
      aO = aN ? aN.max.y + aN.min.y : this.textHeight;
      aM.font = this.font = this.textHeight + 'px ' + this.textFont;
      aL = this.MeasureText(aM);
      if (aP.txtOpt) {
        aQ = aP.txtScale;
        i = aQ * this.textHeight;
        aJ = i + 'px ' + this.textFont;
        j = [aQ * aP.shadowOffset[0], aQ * aP.shadowOffset[1]];
        aM.font = aJ;
        aH = this.MeasureText(aM);
        aK = new g(this.text, aJ, aH + aQ, (aQ * aO) + aQ, aH, this.line_widths, aP.textAlign, aP.textVAlign, aQ);
        if (this.image) {
          aK.SetImage(this.image, this.iw, this.ih, aP.imagePosition, aP.imagePadding, aP.imageAlign, aP.imageVAlign, aP.imageScale);
        }
        aI = aK.Create(this.colour, this.bgColour, this.bgOutline, aQ * this.bgOutlineThickness, aP.shadow, aQ * aP.shadowBlur, j, aQ * this.padding, aQ * this.bgRadius);
        if (aP.outlineMethod == 'colour') {
          this.oimage = aK.Create(this.outline.colour, this.bgColour, this.outline.colour, aQ * this.bgOutlineThickness, aP.shadow, aQ * aP.shadowBlur, j, aQ * this.padding, aQ * this.bgRadius);
        } else {
          if (aP.outlineMethod == 'size') {
            aN = t(this.text, this.textFont, this.textHeight + aP.outlineIncrease);
            i = aN.max.y + aN.min.y;
            aJ = (aQ * (this.textHeight + aP.outlineIncrease)) + 'px ' + this.textFont;
            aM.font = aJ;
            aH = this.MeasureText(aM);
            aK = new g(this.text, aJ, aH + aQ, (aQ * i) + aQ, aH, this.line_widths, aP.textAlign, aP.textVAlign, aQ);
            if (this.image) {
              aK.SetImage(this.image, this.iw + aP.outlineIncrease, this.ih + aP.outlineIncrease, aP.imagePosition, aP.imagePadding, aP.imageAlign, aP.imageVAlign, aP.imageScale);
            }
            this.oimage = aK.Create(this.colour, this.bgColour, this.bgOutline, aQ * this.bgOutlineThickness, aP.shadow, aQ * aP.shadowBlur, j, aQ * this.padding, aQ * this.bgRadius);
            this.oscale = this.oimage.width / aI.width;
            if (aP.outlineIncrease > 0) {
              aI = v(aI, this.oimage.width, this.oimage.height);
            } else {
              this.oimage = v(this.oimage, aI.width, aI.height);
            }
          }
        }
        if (aI) {
          this.fimage = aI;
          aL = this.fimage.width / aQ;
          aO = this.fimage.height / aQ;
        }
        this.SetDraw(aP);
        aP.txtOpt = !!this.fimage;
      }
      this.h = aO;
      this.w = aL;
    }
    ;
    c.SetFont = function(j, aI, aH, i) {
      this.textFont = j;
      this.colour = aI;
      this.bgColour = aH;
      this.bgOutline = i;
      this.Measure(this.tc.ctxt, this.tc);
    }
    ;
    c.SetWeight = function(aH) {
      var j = this.tc, aJ = j.weightMode.split(/[, ]/), i, aI, aK = aH.length;
      if (!this.HasText()) {
        return;
      }
      this.weighted = true;
      for (aI = 0; aI < aK; ++aI) {
        i = aJ[aI] || 'size';
        if ('both' == i) {
          this.Weight(aH[aI], j.ctxt, j, 'size', j.min_weight[aI], j.max_weight[aI], aI);
          this.Weight(aH[aI], j.ctxt, j, 'colour', j.min_weight[aI], j.max_weight[aI], aI);
        } else {
          this.Weight(aH[aI], j.ctxt, j, i, j.min_weight[aI], j.max_weight[aI], aI);
        }
      }
      this.Measure(j.ctxt, j);
    }
    ;
    c.Weight = function(aH, aM, aI, j, aL, aJ, aK) {
      aH = isNaN(aH) ? 1 : aH;
      var i = (aH - aL) / (aJ - aL);
      if ('colour' == j) {
        this.colour = k(aI, i, aK);
      } else {
        if ('bgcolour' == j) {
          this.bgColour = k(aI, i, aK);
        } else {
          if ('bgoutline' == j) {
            this.bgOutline = k(aI, i, aK);
          } else {
            if ('outline' == j) {
              this.outline.colour = k(aI, i, aK);
            } else {
              if ('size' == j) {
                if (aI.weightSizeMin > 0 && aI.weightSizeMax > aI.weightSizeMin) {
                  this.textHeight = aI.weightSize * (aI.weightSizeMin + (aI.weightSizeMax - aI.weightSizeMin) * i);
                } else {
                  this.textHeight = s(1, aH * aI.weightSize);
                }
              }
            }
          }
        }
      }
    }
    ;
    c.SetShadowColourFixed = function(aH, j, i) {
      aH.shadowColor = j;
    }
    ;
    c.SetShadowColourAlpha = function(aH, j, i) {
      aH.shadowColor = U(j, i);
    }
    ;
    c.DrawText = function(aJ, aM, aI) {
      var aN = this.tc, aL = this.x, aK = this.y, aO = this.sc, j, aH;
      aJ.globalAlpha = this.alpha;
      aJ.fillStyle = this.colour;
      aN.shadow && this.SetShadowColour(aJ, aN.shadow, this.alpha);
      aJ.font = this.font;
      aL += aM / aO;
      aK += (aI / aO) - (this.h / 2);
      for (j = 0; j < this.text.length; ++j) {
        aH = aL;
        if ('right' == aN.textAlign) {
          aH += this.w / 2 - this.line_widths[j];
        } else {
          if ('centre' == aN.textAlign) {
            aH -= this.line_widths[j] / 2;
          } else {
            aH -= this.w / 2;
          }
        }
        aJ.setTransform(aO, 0, 0, aO, aO * aH, aO * aK);
        aJ.fillText(this.text[j], 0, 0);
        aK += this.textHeight;
      }
    }
    ;
    c.DrawImage = function(aJ, aQ, aI, aL) {
      var aN = this.x
        , aK = this.y
        , aR = this.sc
        , j = aL || this.fimage
        , aO = this.w
        , aH = this.h
        , aM = this.alpha
        , aP = this.shadow;
      aJ.globalAlpha = aM;
      aP && this.SetShadowColour(aJ, aP, aM);
      aN += (aQ / aR) - (aO / 2);
      aK += (aI / aR) - (aH / 2);
      aJ.setTransform(aR, 0, 0, aR, aR * aN, aR * aK);
      aJ.drawImage(j, 0, 0, aO, aH);
    }
    ;
    c.DrawImageIE = function(aJ, aN, aI) {
      var j = this.fimage
        , aO = this.sc
        , aM = j.width = this.w * aO
        , aH = j.height = this.h * aO
        , aL = (this.x * aO) + aN - (aM / 2)
        , aK = (this.y * aO) + aI - (aH / 2);
      aJ.setTransform(1, 0, 0, 1, 0, 0);
      aJ.globalAlpha = this.alpha;
      aJ.drawImage(j, aL, aK);
    }
    ;
    c.Calc = function(i, aH) {
      var j, aK = this.tc, aJ = aK.minBrightness, aI = aK.maxBrightness, aL = aK.max_radius;
      j = i.xform(this.position);
      this.xformed = j;
      j = V(aK, j, aK.stretchX, aK.stretchY);
      this.x = j.x;
      this.y = j.y;
      this.z = j.z;
      this.sc = j.w;
      this.alpha = aH * av(aJ + (aI - aJ) * (aL - this.z) / (2 * aL), 0, 1);
      return this.xformed;
    }
    ;
    c.UpdateActive = function(aM, aH, aK) {
      var aJ = this.outline
        , j = this.w
        , aI = this.h
        , i = this.x - j / 2
        , aL = this.y - aI / 2;
      aJ.Update(i, aL, j, aI, this.sc, this.z, aH, aK);
      return aJ;
    }
    ;
    c.CheckActive = function(aJ, i, aI) {
      var j = this.tc
        , aH = this.UpdateActive(aJ, i, aI);
      return aH.Active(aJ, j.mx, j.my) ? aH : null;
    }
    ;
    c.Clicked = function(aK) {
      var j = this.a, aH = j.target, aI = j.href, i;
      if (aH != '' && aH != '_self') {
        if (self.frames[aH]) {
          self.frames[aH].document.location = aI;
        } else {
          try {
            if (top.frames[aH]) {
              top.frames[aH].document.location = aI;
              return;
            }
          } catch (aJ) {
          }
          window.open(aI, aH);
        }
        return;
      }
      if (C.createEvent) {
        i = C.createEvent('MouseEvents');
        i.initMouseEvent('click', 1, 1, window, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null);
        if (!j.dispatchEvent(i)) {
          return;
        }
      } else {
        if (j.fireEvent) {
          if (!j.fireEvent('onclick')) {
            return;
          }
        }
      }
      C.location = aI;
    }
    ;

    function y(aN, j, aI) {
      var aH, aK, aM = C.getElementById(aN), aJ = ['id', 'class', 'innerHTML'], aL;
      if (!aM) {
        throw 0;
      }
      if (ai(window.G_vmlCanvasManager)) {
        aM = window.G_vmlCanvasManager.initElement(aM);
        this.ie = parseFloat(navigator.appVersion.split('MSIE')[1]);
      }
      if (aM && (!aM.getContext || !aM.getContext('2d').fillText)) {
        aK = C.createElement('DIV');
        for (aH = 0; aH < aJ.length; ++aH) {
          aK[aJ[aH]] = aM[aJ[aH]];
        }
        aM.parentNode.insertBefore(aK, aM);
        aM.parentNode.removeChild(aM);
        throw 0;
      }
      for (aH in y.options) {
        this[aH] = aI && ai(aI[aH]) ? aI[aH] : (ai(y[aH]) ? y[aH] : y.options[aH]);
      }
      this.canvas = aM;
      this.ctxt = aM.getContext('2d');
      this.z1 = 250 / s(this.depth, 0.001);
      this.z2 = this.z1 / this.zoom;
      this.radius = aD(aM.height, aM.width) * 0.0075;
      this.max_radius = 100;
      this.max_weight = [];
      this.min_weight = [];
      this.textFont = this.textFont && o(this.textFont);
      this.textHeight *= 1;
      this.imageRadius = this.imageRadius.toString();
      this.pulsateTo = av(this.pulsateTo, 0, 1);
      this.minBrightness = av(this.minBrightness, 0, 1);
      this.maxBrightness = av(this.maxBrightness, this.minBrightness, 1);
      this.ctxt.textBaseline = 'top';
      this.lx = (this.lock + '').indexOf('x') + 1;
      this.ly = (this.lock + '').indexOf('y') + 1;
      this.frozen = this.dx = this.dy = this.fixedAnim = this.touchState = 0;
      this.fixedAlpha = 1;
      this.source = j || aN;
      this.repeatTags = aD(64, ~~this.repeatTags);
      this.minTags = aD(200, ~~this.minTags);
      if (~~this.scrollPause > 0) {
        y.scrollPause = ~~this.scrollPause;
      } else {
        this.scrollPause = 0;
      }
      if (this.minTags > 0 && this.repeatTags < 1 && (aH = this.GetTags().length)) {
        this.repeatTags = ap(this.minTags / aH) - 1;
      }
      this.transform = R.Identity();
      this.startTime = this.time = G();
      this.mx = this.my = -1;
      this.centreImage && ao(this);
      this.Animate = this.dragControl ? this.AnimateDrag : this.AnimatePosition;
      this.animTiming = (typeof y[this.animTiming] == 'function' ? y[this.animTiming] : y.Smooth);
      if (this.shadowBlur || this.shadowOffset[0] || this.shadowOffset[1]) {
        this.ctxt.shadowColor = this.shadow;
        this.shadow = this.ctxt.shadowColor;
        this.shadowAlpha = al();
      } else {
        delete this.shadow;
      }
      this.Load();
      if (j && this.hideTags) {
        (function(i) {
            if (y.loaded) {
              i.HideTags();
            } else {
              ad('load', function() {
                i.HideTags();
              }, window);
            }
          }
        )(this);
      }
      this.yaw = this.initial ? this.initial[0] * this.maxSpeed : 0;
      this.pitch = this.initial ? this.initial[1] * this.maxSpeed : 0;
      if (this.tooltip) {
        this.ctitle = aM.title;
        aM.title = '';
        if (this.tooltip == 'native') {
          this.Tooltip = this.TooltipNative;
        } else {
          this.Tooltip = this.TooltipDiv;
          if (!this.ttdiv) {
            this.ttdiv = C.createElement('div');
            this.ttdiv.className = this.tooltipClass;
            this.ttdiv.style.position = 'absolute';
            this.ttdiv.style.zIndex = aM.style.zIndex + 1;
            ad('mouseover', function(i) {
              i.target.style.display = 'none';
            }, this.ttdiv);
            C.body.appendChild(this.ttdiv);
          }
        }
      } else {
        this.Tooltip = this.TooltipNone;
      }
      if (!this.noMouse && !b[aN]) {
        b[aN] = [['mousemove', af], ['mouseout', B], ['mouseup', aE], ['touchstart', T], ['touchend', r], ['touchcancel', r], ['touchmove', az]];
        if (this.dragControl) {
          b[aN].push(['mousedown', z]);
          b[aN].push(['selectstart', aA]);
        }
        if (this.wheelZoom) {
          b[aN].push(['mousewheel', ag]);
          b[aN].push(['DOMMouseScroll', ag]);
        }
        if (this.scrollPause) {
          b[aN].push(['scroll', ac, window]);
        }
        for (aH = 0; aH < b[aN].length; ++aH) {
          aK = b[aN][aH];
          ad(aK[0], aK[1], aK[2] ? aK[2] : aM);
        }
      }
      if (!y.started) {
        aL = window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
        y.NextFrame = aL ? y.NextFrameRAF : y.NextFrameTimeout;
        y.interval = this.interval;
        y.NextFrame(this.interval);
        y.started = 1;
      }
    }

    Q = y.prototype;
    Q.SourceElements = function() {
      if (C.querySelectorAll) {
        return C.querySelectorAll('#' + this.source);
      }
      return [C.getElementById(this.source)];
    }
    ;
    Q.HideTags = function() {
      var aH = this.SourceElements(), j;
      for (j = 0; j < aH.length; ++j) {
        aH[j].style.display = 'none';
      }
    }
    ;
    Q.GetTags = function() {
      var aM = this.SourceElements(), aL, aI = [], aK, aJ, aH;
      for (aH = 0; aH <= this.repeatTags; ++aH) {
        for (aK = 0; aK < aM.length; ++aK) {
          aL = aM[aK].getElementsByTagName('a');
          for (aJ = 0; aJ < aL.length; ++aJ) {
            aI.push(aL[aJ]);
          }
        }
      }
      return aI;
    }
    ;
    Q.Message = function(aM) {
      var aO = [], aI, j, aH = aM.split(''), aK, aN, aL, aJ;
      for (aI = 0; aI < aH.length; ++aI) {
        if (aH[aI] != ' ') {
          j = aI - aH.length / 2;
          aK = C.createElement('A');
          aK.href = '#';
          aK.innerText = aH[aI];
          aL = 100 * ah(j / 9);
          aJ = -100 * w(j / 9);
          aN = new e(this, aH[aI], aK, [aL, 0, aJ], 2, 18, '#000', '#fff', 0, 0, 0, 'monospace', 2, aH[aI]);
          aN.Init();
          aO.push(aN);
        }
      }
      return aO;
    }
    ;
    Q.CreateTag = function(aL) {
      var aO, aJ, aP, aK, aN, aH, aM, aI, j = [0, 0, 0];
      if ('text' != this.imageMode) {
        aO = aL.getElementsByTagName('img');
        if (aO.length) {
          aJ = new Image;
          aJ.src = aO[0].src;
          if (!this.imageMode) {
            aP = new e(this, '', aL, j, 0, 0);
            aP.SetImage(aJ);
            aw(aJ, aO[0], aP, this);
            return aP;
          }
        }
      }
      if ('image' != this.imageMode) {
        aN = new aB(aL);
        aK = aN.Lines();
        if (!aN.Empty()) {
          aH = this.textFont || o(Y(aL, 'font-family'));
          if (this.splitWidth) {
            aK = aN.SplitWidth(this.splitWidth, this.ctxt, aH, this.textHeight);
          }
          aM = this.bgColour == 'tag' ? Y(aL, 'background-color') : this.bgColour;
          aI = this.bgOutline == 'tag' ? Y(aL, 'color') : this.bgOutline;
        } else {
          aN = null;
        }
      }
      if (aN || aJ) {
        aP = new e(this, aK, aL, j, 2, this.textHeight + 2, this.textColour || Y(aL, 'color'), aM, this.bgRadius, aI, this.bgOutlineThickness, aH, this.padding, aN && aN.original);
        if (aJ) {
          aP.SetImage(aJ);
          aw(aJ, aO[0], aP, this);
        } else {
          aP.Init();
        }
        return aP;
      }
    }
    ;
    Q.UpdateTag = function(aH, i) {
      var aK = this.textColour || Y(i, 'color')
        , j = this.textFont || o(Y(i, 'font-family'))
        , aJ = this.bgColour == 'tag' ? Y(i, 'background-color') : this.bgColour
        , aI = this.bgOutline == 'tag' ? Y(i, 'color') : this.bgOutline;
      aH.a = i;
      aH.title = i.title;
      if (aH.colour != aK || aH.textFont != j || aH.bgColour != aJ || aH.bgOutline != aI) {
        aH.SetFont(j, aK, aJ, aI);
      }
    }
    ;
    Q.Weight = function(aN) {
      var aJ = aN.length, aL, aH, aO, aK = [], j, aI = this.weightFrom ? this.weightFrom.split(/[, ]/) : [null],
        aM = aI.length;
      for (aH = 0; aH < aJ; ++aH) {
        aK[aH] = [];
        for (aO = 0; aO < aM; ++aO) {
          aL = u(aN[aH].a, aI[aO], this.textHeight);
          if (!this.max_weight[aO] || aL > this.max_weight[aO]) {
            this.max_weight[aO] = aL;
          }
          if (!this.min_weight[aO] || aL < this.min_weight[aO]) {
            this.min_weight[aO] = aL;
          }
          aK[aH][aO] = aL;
        }
      }
      for (aO = 0; aO < aM; ++aO) {
        if (this.max_weight[aO] > this.min_weight[aO]) {
          j = 1;
        }
      }
      if (j) {
        for (aH = 0; aH < aJ; ++aH) {
          aN[aH].SetWeight(aK[aH]);
        }
      }
    }
    ;
    Q.Load = function() {
      var aR = this.GetTags(), aM = [], aP, aQ, aL, aI, aH, j, aJ, aO, aK = [], aN = {
        sphere: q,
        vcylinder: am,
        hcylinder: au,
        vring: d,
        hring: n
      };
      if (aR.length) {
        aK.length = aR.length;
        for (aO = 0; aO < aR.length; ++aO) {
          aK[aO] = aO;
        }
        this.shuffleTags && an(aK);
        aI = 100 * this.radiusX;
        aH = 100 * this.radiusY;
        j = 100 * this.radiusZ;
        this.max_radius = s(aI, s(aH, j));
        for (aO = 0; aO < aR.length; ++aO) {
          aQ = this.CreateTag(aR[aK[aO]]);
          if (aQ) {
            aM.push(aQ);
          }
        }
        this.weight && this.Weight(aM, true);
        if (this.shapeArgs) {
          this.shapeArgs[0] = aM.length;
        } else {
          aL = this.shape.toString().split(/[(),]/);
          aP = aL.shift();
          if (typeof window[aP] === 'function') {
            this.shape = window[aP];
          } else {
            this.shape = aN[aP] || aN.sphere;
          }
          this.shapeArgs = [aM.length, aI, aH, j].concat(aL);
        }
        aJ = this.shape.apply(this, this.shapeArgs);
        this.listLength = aM.length;
        for (aO = 0; aO < aM.length; ++aO) {
          aM[aO].position = new ae(aJ[aO][0], aJ[aO][1], aJ[aO][2]);
        }
      }
      if (this.noTagsMessage && !aM.length) {
        aO = (this.imageMode && this.imageMode != 'both' ? this.imageMode + ' ' : '');
        aM = this.Message('No ' + aO + 'tags');
      }
      this.taglist = aM;
    }
    ;
    Q.Update = function() {
      var aQ = this.GetTags(), aP = [], aK = this.taglist, aR, aO = [], aM = [], aI, aN, aH, aL, aJ;
      if (!this.shapeArgs) {
        return this.Load();
      }
      if (aQ.length) {
        aH = this.listLength = aQ.length;
        aN = aK.length;
        for (aL = 0; aL < aN; ++aL) {
          aP.push(aK[aL]);
          aM.push(aL);
        }
        for (aL = 0; aL < aH; ++aL) {
          for (aJ = 0,
                 aR = 0; aJ < aN; ++aJ) {
            if (aK[aJ].EqualTo(aQ[aL])) {
              this.UpdateTag(aP[aJ], aQ[aL]);
              aR = aM[aJ] = -1;
            }
          }
          if (!aR) {
            aO.push(aL);
          }
        }
        for (aL = 0,
               aJ = 0; aL < aN; ++aL) {
          if (aM[aJ] == -1) {
            aM.splice(aJ, 1);
          } else {
            ++aJ;
          }
        }
        if (aM.length) {
          an(aM);
          while (aM.length && aO.length) {
            aL = aM.shift();
            aJ = aO.shift();
            aP[aL] = this.CreateTag(aQ[aJ]);
          }
          aM.sort(function(j, i) {
            return j - i;
          });
          while (aM.length) {
            aP.splice(aM.pop(), 1);
          }
        }
        aJ = aP.length / (aO.length + 1);
        aL = 0;
        while (aO.length) {
          aP.splice(ap(++aL * aJ), 0, this.CreateTag(aQ[aO.shift()]));
        }
        this.shapeArgs[0] = aH = aP.length;
        aI = this.shape.apply(this, this.shapeArgs);
        for (aL = 0; aL < aH; ++aL) {
          aP[aL].position = new ae(aI[aL][0], aI[aL][1], aI[aL][2]);
        }
        this.weight && this.Weight(aP);
      }
      this.taglist = aP;
    }
    ;
    Q.SetShadow = function(i) {
      i.shadowBlur = this.shadowBlur;
      i.shadowOffsetX = this.shadowOffset[0];
      i.shadowOffsetY = this.shadowOffset[1];
    }
    ;
    Q.Draw = function(aR) {
      if (this.paused) {
        return;
      }
      var aL = this.canvas, aJ = aL.width, aQ = aL.height, aT = 0, aI = (aR - this.time) * y.interval / 1000,
        aP = aJ / 2 + this.offsetX, aO = aQ / 2 + this.offsetY, aX = this.ctxt, aN, aY, aV, aH = -1, aK = this.taglist,
        aU = aK.length, j = this.frontSelect, aS = (this.centreFunc == aA), aM;
      this.time = aR;
      if (this.frozen && this.drawn) {
        return this.Animate(aJ, aQ, aI);
      }
      aM = this.AnimateFixed();
      aX.setTransform(1, 0, 0, 1, 0, 0);
      for (aV = 0; aV < aU; ++aV) {
        aK[aV].Calc(this.transform, this.fixedAlpha);
      }
      aK = A(aK, function(aZ, i) {
        return i.z - aZ.z;
      });
      if (aM && this.fixedAnim.active) {
        aN = this.fixedAnim.tag.UpdateActive(aX, aP, aO);
      } else {
        this.active = null;
        for (aV = 0; aV < aU; ++aV) {
          aY = this.mx >= 0 && this.my >= 0 && this.taglist[aV].CheckActive(aX, aP, aO);
          if (aY && aY.sc > aT && (!j || aY.z <= 0)) {
            aN = aY;
            aH = aV;
            aN.tag = this.taglist[aV];
            aT = aY.sc;
          }
        }
        this.active = aN;
      }
      this.txtOpt || (this.shadow && this.SetShadow(aX));
      aX.clearRect(0, 0, aJ, aQ);
      for (aV = 0; aV < aU; ++aV) {
        if (!aS && aK[aV].z <= 0) {
          try {
            this.centreFunc(aX, aJ, aQ, aP, aO);
          } catch (aW) {
            alert(aW);
            this.centreFunc = aA;
          }
          aS = true;
        }
        if (!(aN && aN.tag == aK[aV] && aN.PreDraw(aX, aK[aV], aP, aO))) {
          aK[aV].Draw(aX, aP, aO);
        }
        aN && aN.tag == aK[aV] && aN.PostDraw(aX);
      }
      if (this.freezeActive && aN) {
        this.Freeze();
      } else {
        this.UnFreeze();
        this.drawn = (aU == this.listLength);
      }
      if (this.fixedCallback) {
        this.fixedCallback(this, this.fixedCallbackTag);
        this.fixedCallback = null;
      }
      aM || this.Animate(aJ, aQ, aI);
      aN && aN.LastDraw(aX);
      aL.style.cursor = aN ? this.activeCursor : '';
      this.Tooltip(aN, this.taglist[aH]);
    }
    ;
    Q.TooltipNone = function() {
    }
    ;
    Q.TooltipNative = function(j, i) {
      if (j) {
        this.canvas.title = i && i.title ? i.title : '';
      } else {
        this.canvas.title = this.ctitle;
      }
    }
    ;
    Q.SetTTDiv = function(aI, j) {
      var i = this
        , aH = i.ttdiv.style;
      if (aI != i.ttdiv.innerHTML) {
        aH.display = 'none';
      }
      i.ttdiv.innerHTML = aI;
      j && (j.title = i.ttdiv.innerHTML);
      if (aH.display == 'none' && !i.tttimer) {
        i.tttimer = setTimeout(function() {
          var aJ = ab(i.canvas.id);
          aH.display = 'block';
          aH.left = aJ.x + i.mx + 'px';
          aH.top = aJ.y + i.my + 24 + 'px';
          i.tttimer = null;
        }, i.tooltipDelay);
      }
    }
    ;
    Q.TooltipDiv = function(j, i) {
      if (j && i && i.title) {
        this.SetTTDiv(i.title, i);
      } else {
        if (!j && this.mx != -1 && this.my != -1 && this.ctitle.length) {
          this.SetTTDiv(this.ctitle);
        } else {
          this.ttdiv.style.display = 'none';
        }
      }
    }
    ;
    Q.Transform = function(aK, i, aM) {
      if (i || aM) {
        var j = ah(i)
          , aL = w(i)
          , aN = ah(aM)
          , aJ = w(aM)
          , aH = new R([aJ, 0, aN, 0, 1, 0, -aN, 0, aJ])
          , aI = new R([1, 0, 0, 0, aL, -j, 0, j, aL]);
        aK.transform = aK.transform.mul(aH.mul(aI));
      }
    }
    ;
    Q.AnimateFixed = function() {
      var aH, j, aJ, i, aI;
      if (this.fadeIn) {
        j = G() - this.startTime;
        if (j >= this.fadeIn) {
          this.fadeIn = 0;
          this.fixedAlpha = 1;
        } else {
          this.fixedAlpha = j / this.fadeIn;
        }
      }
      if (this.fixedAnim) {
        if (!this.fixedAnim.transform) {
          this.fixedAnim.transform = this.transform;
        }
        aH = this.fixedAnim,
          j = G() - aH.t0,
          aJ = aH.angle,
          i,
          aI = this.animTiming(aH.t, j);
        this.transform = aH.transform;
        if (j >= aH.t) {
          this.fixedCallbackTag = aH.tag;
          this.fixedCallback = aH.cb;
          this.fixedAnim = this.yaw = this.pitch = 0;
        } else {
          aJ *= aI;
        }
        i = R.Rotation(aJ, aH.axis);
        this.transform = this.transform.mul(i);
        return (this.fixedAnim != 0);
      }
      return false;
    }
    ;
    Q.AnimatePosition = function(aH, aK, aI) {
      var j = this, i = j.mx, aM = j.my, aJ, aL;
      if (!j.frozen && i >= 0 && aM >= 0 && i < aH && aM < aK) {
        aJ = j.maxSpeed,
          aL = j.reverse ? -1 : 1;
        j.lx || (j.yaw = ((i * 2 * aJ / aH) - aJ) * aL * aI);
        j.ly || (j.pitch = ((aM * 2 * aJ / aK) - aJ) * -aL * aI);
        j.initial = null;
      } else {
        if (!j.initial) {
          if (j.frozen && !j.freezeDecel) {
            j.yaw = j.pitch = 0;
          } else {
            j.Decel(j);
          }
        }
      }
      this.Transform(j, j.pitch, j.yaw);
    }
    ;
    Q.AnimateDrag = function(j, aJ, aI) {
      var i = this
        , aH = 100 * aI * i.maxSpeed / i.max_radius / i.zoom;
      if (i.dx || i.dy) {
        i.lx || (i.yaw = i.dx * aH / i.stretchX);
        i.ly || (i.pitch = i.dy * -aH / i.stretchY);
        i.dx = i.dy = 0;
        i.initial = null;
      } else {
        if (!i.initial) {
          i.Decel(i);
        }
      }
      this.Transform(i, i.pitch, i.yaw);
    }
    ;
    Q.Freeze = function() {
      if (!this.frozen) {
        this.preFreeze = [this.yaw, this.pitch];
        this.frozen = 1;
        this.drawn = 0;
      }
    }
    ;
    Q.UnFreeze = function() {
      if (this.frozen) {
        this.yaw = this.preFreeze[0];
        this.pitch = this.preFreeze[1];
        this.frozen = 0;
      }
    }
    ;
    Q.Decel = function(i) {
      var aH = i.minSpeed
        , aI = L(i.yaw)
        , j = L(i.pitch);
      if (!i.lx && aI > aH) {
        i.yaw = aI > i.z0 ? i.yaw * i.decel : 0;
      }
      if (!i.ly && j > aH) {
        i.pitch = j > i.z0 ? i.pitch * i.decel : 0;
      }
    }
    ;
    Q.Zoom = function(i) {
      this.z2 = this.z1 * (1 / i);
      this.drawn = 0;
    }
    ;
    Q.Clicked = function(aH) {
      var i = this.active;
      try {
        if (i && i.tag) {
          if (this.clickToFront === false || this.clickToFront === null) {
            i.tag.Clicked(aH);
          } else {
            this.TagToFront(i.tag, this.clickToFront, function() {
              i.tag.Clicked(aH);
            }, true);
          }
        }
      } catch (j) {
      }
    }
    ;
    Q.Wheel = function(j) {
      var aH = this.zoom + this.zoomStep * (j ? 1 : -1);
      this.zoom = aD(this.zoomMax, s(this.zoomMin, aH));
      this.Zoom(this.zoom);
    }
    ;
    Q.BeginDrag = function(i) {
      this.down = S(i, this.canvas);
      i.cancelBubble = true;
      i.returnValue = false;
      i.preventDefault && i.preventDefault();
    }
    ;
    Q.Drag = function(aJ, aI) {
      if (this.dragControl && this.down) {
        var aH = this.dragThreshold * this.dragThreshold
          , j = aI.x - this.down.x
          , i = aI.y - this.down.y;
        if (this.dragging || j * j + i * i > aH) {
          this.dx = j;
          this.dy = i;
          this.dragging = 1;
          this.down = aI;
        }
      }
      return this.dragging;
    }
    ;
    Q.EndDrag = function() {
      var i = this.dragging;
      this.dragging = this.down = null;
      return i;
    }
    ;

    function D(aH) {
      var j = aH.targetTouches[0]
        , i = aH.targetTouches[1];
      return F(at(i.pageX - j.pageX, 2) + at(i.pageY - j.pageY, 2));
    }

    Q.BeginPinch = function(i) {
      this.pinched = [D(i), this.zoom];
      i.preventDefault && i.preventDefault();
    }
    ;
    Q.Pinch = function(j) {
      var aI, aH, i = this.pinched;
      if (!i) {
        return;
      }
      aH = D(j);
      aI = i[1] * aH / i[0];
      this.zoom = aD(this.zoomMax, s(this.zoomMin, aI));
      this.Zoom(this.zoom);
    }
    ;
    Q.EndPinch = function(i) {
      this.pinched = null;
    }
    ;
    Q.Pause = function() {
      this.paused = true;
    }
    ;
    Q.Resume = function() {
      this.paused = false;
    }
    ;
    Q.SetSpeed = function(j) {
      this.initial = j;
      this.yaw = j[0] * this.maxSpeed;
      this.pitch = j[1] * this.maxSpeed;
    }
    ;
    Q.FindTag = function(aH) {
      if (!ai(aH)) {
        return null;
      }
      ai(aH.index) && (aH = aH.index);
      if (!I(aH)) {
        return this.taglist[aH];
      }
      var aI, aJ, j;
      if (ai(aH.id)) {
        aI = 'id',
          aJ = aH.id;
      } else {
        if (ai(aH.text)) {
          aI = 'innerText',
            aJ = aH.text;
        }
      }
      for (j = 0; j < this.taglist.length; ++j) {
        if (this.taglist[j].a[aI] == aJ) {
          return this.taglist[j];
        }
      }
    }
    ;
    Q.RotateTag = function(aP, aI, aO, i, aM, aH) {
      var aN = aP.Calc(this.transform, 1)
        , aK = new ae(aN.x, aN.y, aN.z)
        , aJ = aj(aO, aI)
        , j = aK.angle(aJ)
        , aL = aK.cross(aJ).unit();
      if (j == 0) {
        this.fixedCallbackTag = aP;
        this.fixedCallback = aM;
      } else {
        this.fixedAnim = {
          angle: -j,
          axis: aL,
          t: i,
          t0: G(),
          cb: aM,
          tag: aP,
          active: aH
        };
      }
    }
    ;
    Q.TagToFront = function(i, aH, aI, j) {
      this.RotateTag(i, 0, 0, aH, aI, j);
    }
    ;
    y.Start = function(aH, i, j) {
      y.Delete(aH);
      y.tc[aH] = new y(aH, i, j);
    }
    ;

    function ay(i, j) {
      y.tc[j] && y.tc[j][i]();
    }

    y.Linear = function(i, j) {
      return j / i;
    }
    ;
    y.Smooth = function(i, j) {
      return 0.5 - w(j * Math.PI / i) / 2;
    }
    ;
    y.Pause = function(i) {
      ay('Pause', i);
    }
    ;
    y.Resume = function(i) {
      ay('Resume', i);
    }
    ;
    y.Reload = function(i) {
      ay('Load', i);
    }
    ;
    y.Update = function(i) {
      ay('Update', i);
    }
    ;
    y.SetSpeed = function(j, i) {
      if (I(i) && y.tc[j] && !isNaN(i[0]) && !isNaN(i[1])) {
        y.tc[j].SetSpeed(i);
        return true;
      }
      return false;
    }
    ;
    y.TagToFront = function(j, i) {
      if (!I(i)) {
        return false;
      }
      i.lat = i.lng = 0;
      return y.RotateTag(j, i);
    }
    ;
    y.RotateTag = function(aH, i) {
      if (I(i) && y.tc[aH]) {
        if (isNaN(i.time)) {
          i.time = 500;
        }
        var j = y.tc[aH].FindTag(i);
        if (j) {
          y.tc[aH].RotateTag(j, i.lat, i.lng, i.time, i.callback, i.active);
          return true;
        }
      }
      return false;
    }
    ;
    y.Delete = function(aI) {
      var j, aH;
      if (b[aI]) {
        aH = C.getElementById(aI);
        if (aH) {
          for (j = 0; j < b[aI].length; ++j) {
            a(b[aI][j][0], b[aI][j][1], aH);
          }
        }
      }
      delete b[aI];
      delete y.tc[aI];
    }
    ;
    y.NextFrameRAF = function() {
      requestAnimationFrame(E);
    }
    ;
    y.NextFrameTimeout = function(i) {
      setTimeout(O, i);
    }
    ;
    y.tc = {};
    y.options = {
      z1: 20000,
      z2: 20000,
      z0: 0.0002,
      freezeActive: false,
      freezeDecel: false,
      activeCursor: 'pointer',
      pulsateTo: 1,
      pulsateTime: 3,
      reverse: false,
      depth: 0.5,
      maxSpeed: 0.05,
      minSpeed: 0,
      decel: 0.95,
      interval: 20,
      minBrightness: 0.1,
      maxBrightness: 1,
      outlineColour: '#ffff99',
      outlineThickness: 2,
      outlineOffset: 5,
      outlineMethod: 'outline',
      outlineRadius: 0,
      textColour: '#ff99ff',
      textHeight: 15,
      textFont: 'Helvetica, Arial, sans-serif',
      shadow: '#000',
      shadowBlur: 0,
      shadowOffset: [0, 0],
      initial: null,
      hideTags: true,
      zoom: 1,
      weight: false,
      weightMode: 'size',
      weightFrom: null,
      weightSize: 1,
      weightSizeMin: null,
      weightSizeMax: null,
      weightGradient: {
        0: '#f00',
        0.33: '#ff0',
        0.66: '#0f0',
        1: '#00f'
      },
      txtOpt: true,
      txtScale: 2,
      frontSelect: false,
      wheelZoom: true,
      zoomMin: 0.3,
      zoomMax: 3,
      zoomStep: 0.05,
      shape: 'sphere',
      lock: null,
      tooltip: null,
      tooltipDelay: 300,
      tooltipClass: 'tctooltip',
      radiusX: 1,
      radiusY: 1,
      radiusZ: 1,
      stretchX: 1,
      stretchY: 1,
      offsetX: 0,
      offsetY: 0,
      shuffleTags: false,
      noSelect: false,
      noMouse: false,
      imageScale: 1,
      paused: false,
      dragControl: false,
      dragThreshold: 4,
      centreFunc: aA,
      splitWidth: 0,
      animTiming: 'Smooth',
      clickToFront: false,
      fadeIn: 0,
      padding: 0,
      bgColour: null,
      bgRadius: 0,
      bgOutline: null,
      bgOutlineThickness: 0,
      outlineIncrease: 4,
      textAlign: 'centre',
      textVAlign: 'middle',
      imageMode: null,
      imagePosition: null,
      imagePadding: 2,
      imageAlign: 'centre',
      imageVAlign: 'middle',
      noTagsMessage: true,
      centreImage: null,
      pinchZoom: false,
      repeatTags: 0,
      minTags: 0,
      imageRadius: 0,
      scrollPause: false,
      outlineDash: 0,
      outlineDashSpace: 0,
      outlineDashSpeed: 1
    };
    for (M in y.options) {
      y[M] = y.options[M];
    }
    window.TagCanvas = y;
    ad('load', function() {
      y.loaded = 1;
    }, window);
  }
)();
